package com.zx._12_算法.剑指offer._其他_2025;

/*
    “数字的补数”，说白了就是：给你一个正整数，把它二进制里的 0 和 1 全翻转一遍（只翻它实际用到的那几位），再把结果当成十进制返回。
    比如说，
        给你5：
        5 的二进制是101
        把每一位反过来：010
        010当成二进制就是十进制的2
        所以答案就是2

        再看一个：7：
        7 的二进制是111
        反过来就是000
        最终结果就是0
    注意一点：只翻“有效二进制位”里的 0 和 1，前面的那些无限多的 0 不算。否则你把 5 看成无限前导零…00000101，全翻就变成无限个 1，根本没法表示了。
 */
public class 数字的补数 {

    public static void main(String[] args) {
        System.out.println(findComplement1(5));
        System.out.println(findComplement1(7));

        System.out.println(findComplement2(5));
        System.out.println(findComplement2(7));
    }

    public static int findComplement1(int num) {
        String binaryString = Integer.toBinaryString(num);
        char[] cs = binaryString.toCharArray();

        String res = "";

        for (char c : cs) {
            if (c == '0') {
                res += "1";
            } else {
                res += "0";
            }
        }

        return Integer.parseInt(res, 2);
    }

    public static int findComplement2(int num) {
        int mask = 0;
        int t = num;
        while (t > 0) {
            mask = (mask << 1) | 1;
            t = t >> 1;
        }
        return ~num & mask;
    }
}
